# -*- coding: utf-8 -*-
# @Time    : 2021/4/29 17:26
# @Author  : lilehao
# @Email   : 2811894942@qq.com
# @File    : 迭代器生成器作业.py

# 1、如何判断一个对象是可迭代对象、迭代器对象或生成器
# 看该对象的属性，如果有__iter__的属性说明是可迭代对象
# 如果既有__iter__属性又有__next__属性说明是迭代器
# 有yield关键字则为生成器
#
# 2、迭代器与生成器的区别
# 迭代器需要手动实现__iter__和__next__方法，
# 而生成器不需要手动生成，只需要一个yield的关键字即可
#
# 3、可迭代对象与迭代器的区别
# 可迭代对象的属性中有__iter__的方法。
# 而迭代器中既有__iter__的方法也有__next__的方法
#
# 4、如何定义一个生成器
# 在函数中添加yield的关键字，使之变成生成器函数，
# 当程序遇到yield关键字时就会结束函数的调用，
# 下次再运行时会在该结束的下一句语句开始运行
#
# 5、如何获取可迭代对象
# 进行for循环的遍历获取



# 查找一个文件中最长的行，输出长度
# 考虑文件比较大
# 考虑代码精简

# 生成一个大文件
# import string
# import random
# with open('big.data', 'w+', encoding="utf-8") as f:
# f.write('aaaaaaaaaaaaaaaaaa\n'*10**7)
# f.write(("".join(random.choices(string.ascii_lowercase, k=random.randint(1,50)))+"\n").encode("utf-8"))

import string
import  random
with open("big.txt","w+",encoding="utf-8") as f:
    for i in range(1000):
        # f.write('aaaaaaaaaaaaaaa\n')
        f.write(("".join(random.choices(string.ascii_lowercase,k=random.randint(1,50)))+"\n"))


def read_file(path):
    SIZE = 50000
    with open(path,"rb") as f:
        while True:
            block = f.read(SIZE)
            if block:
                yield block
            else:
                return

g = read_file("big.txt")
j = [0]
for i in g:
     if len(i) >= j[0]:
         j.remove(j[0])
         j.append(len(i))
     else:
         continue
print(f"字符长度最长的长度为:{j[0]}")